#include "RoundTimeBar.h"
#include "qmath.h"
#include <QPropertyAnimation>
#include <QDebug>
#include <QTimer>
#include <QMediaPlayer>
#include <QMovie>
#include <QFile>
#include "qtmaterialflatbutton.h"
#include "qtmaterialdialog.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QMessageBox>
#include "utils/QUIUtils.h"
#include "log.h"

RoundTimeBar::RoundTimeBar(QWidget *parent) :
    QWidget(parent),_value(0),_min(0),_max(100),_precision(0),_dotRadiusDifference(10)
  ,m_nGifWidth(90) // 初始半径差
{
    // 注册 TipType 类型
    qRegisterMetaType<TipType>("TipType");
    
    initData();
    initForm();
    connectTimerService();  // 连接TimerService信号
    
    // 设置初始角度，顺时针逆时针
    setdefault(90,false);
    // 设置默认外圈宽度
    setOutterBarWidth(18);
    // 设置默认内圈宽度
    setInnerBarWidth(16);
    // 设置默认范围
    setRange(0,100);
    // 设置默认值
    setValue(m_timerConfig.durationMs / 1000);  // 使用加载的配置，转换为秒
    // 设置外圈颜色
    setOutterColor(QColor(233,248,248));
    // 设置默认渐变色
    setInnerColor(QColor(49, 177, 190),QColor(133, 243, 244));
    // 设置默认文字颜色
    setDefaultTextColor(QColor(49,177,190));
    // 设置默认精度
    setPrecision(0);
    // 设置内圈默认文字样式
    setInnerDefaultTextStyle(RoundTimeBar::MM_SS);

    // ✅ 连接ConfigService的配置变更信号
    connect(&ConfigService::instance(), &ConfigService::configChanged, 
            this, &RoundTimeBar::updateAllData);
            
    logInfo("RoundTimeBar 初始化完成");
}

RoundTimeBar::~RoundTimeBar()
{
    logInfo("RoundTimeBar 销毁");
}

void RoundTimeBar::setGifWidth(int width)
{
    m_nGifWidth = width;
    m_pStartBtn->setIconSize(QSize(m_nGifWidth, m_nGifWidth));               // 根据需求设置图标大小
    m_pStartBtn->resize(m_nGifWidth,m_nGifWidth);
    m_pReflashBtn->setIconSize(QSize(m_nGifWidth/2, m_nGifWidth/2));               // 根据需求设置图标大小
    m_pReflashBtn->resize(m_nGifWidth/2,m_nGifWidth/2);
    update();
}

void RoundTimeBar::setFont(QFont font)
{
    m_font = font;
}

void RoundTimeBar::SetMute(bool mute)
{
    isMuted = mute;
    // ✅ 使用SoundService设置静音
    SoundService::instance().setMuted(mute);
    logInfo("设置静音: " << (mute ? "开启" : "关闭"));
}

//********************************************** 外部接口 ****************************************
//设置初始角度，顺时针逆时针
void RoundTimeBar::setdefault(int startAngle,bool clockWise)
{
    _startAngle=startAngle;
    _clockWise=clockWise;
}

//设置外圈宽度
void RoundTimeBar::setOutterBarWidth(float width)
{
    _outterBarWidth = width;
}
//设置内圈宽度
void RoundTimeBar::setInnerBarWidth(float width)
{
    _innerBarWidth=width;
}

//设置值的范围
void RoundTimeBar::setRange(float min,float max)
{
    //todo 和value比较
    if(max<min)
    {
        max=100;
        min=0;
    }
    else
    {
        _max=max;
        _min=min;
    }
}

//设置当前值
void RoundTimeBar::setValue(float value)
{
    QPropertyAnimation* animation=new QPropertyAnimation(this,"_value");
    animation->setDuration(500);
    animation->setStartValue(_value);
    animation->setEndValue(value);
    animation->setEasingCurve(QEasingCurve::OutQuad);
    animation->start();
}

void RoundTimeBar::startCountdown()
{
    // ❌ 旧逻辑已移除
    // 现在由TimerService管理，这里只是保留接口兼容性
    logWarning("startCountdown() 已废弃，请使用 TimerService::instance().startTimer()");
}

void RoundTimeBar::stopCountdown()
{
    // ❌ 旧逻辑已移除
    // 现在由TimerService管理
    logWarning("stopCountdown() 已废弃，请使用 TimerService::instance().stopTimer()");
}

void RoundTimeBar::_setValue(float value)
{
    _value=value;
    repaint();
}

//设置外圈颜色
void RoundTimeBar::setOutterColor(const QColor& outterColor)
{
    _outterColor=outterColor;
}

//设置内圈渐变色
void RoundTimeBar::setInnerColor(const QColor& startColor,const QColor& endColor)
{
    _startColor=startColor;
    _endColor=endColor;
}

//设置内圈渐变色
void RoundTimeBar::setInnerColor(const QColor& startColor)
{
    _startColor=startColor;
}

void RoundTimeBar::setDefaultTextColor(const QColor& textColor)
{
    _textColor=textColor;
}

//设置控制
void RoundTimeBar::setControlFlags(int flags)
{
    this->_controlFlags|=flags;
}

//设置显示数字精度
void RoundTimeBar::setPrecision(int precision)
{
    _precision=precision;
}

void RoundTimeBar::setDotRadiusDifference(float difference)
{
    _dotRadiusDifference = difference;
}

//********************************************** 内部绘制部分 ****************************************
void RoundTimeBar::resizeEvent(QResizeEvent *event)
{
    //根据内外圈宽度设置控件最小大小
    if(_outterBarWidth>_innerBarWidth)
        this->setMinimumSize(_outterBarWidth*8+ _dotRadiusDifference,_outterBarWidth*8);
    else
        this->setMinimumSize(_innerBarWidth*8+ _dotRadiusDifference,_innerBarWidth*8);
    //计算绘制正方形区域信息
    caculateSquare();
}

void RoundTimeBar::updateAllData()
{
    initData();
    update();
}

// ========== 新的Service信号处理槽 ==========

void RoundTimeBar::onTimerTick(int remainingMs, int elapsedMs)
{
    // 更新显示值（转换为秒）
    if (m_timerConfig.mode == TimerMode::Countdown) {
        _value = remainingMs / 1000.0f;  // 倒计时显示剩余时间
    } else {
        _value = elapsedMs / 1000.0f;    // 正计时显示已用时间
    }
    
    repaint(); // 更新界面
}

void RoundTimeBar::onAlarmTriggered(TipType alarmType)
{
    logInfo("报警触发: " << (int)alarmType);
    
    // ✅ 使用SoundService播放音频
    SoundService::instance().playAlarm(alarmType, m_soundSettings);
}

void RoundTimeBar::onTimerFinished()
{
    logInfo("计时器完成");
    movie->stop();  // 停止动画
    
    // 停止嘀嗒声
    SoundService::instance().stopTickSound();
    
    // 可以在这里添加完成后的UI效果
}

// ========== 音频播放方法（已简化，使用SoundService） ==========

void RoundTimeBar::stopAlarm()
{
    // ✅ 使用SoundService停止音频
    SoundService::instance().stopSound();
    logDebug("停止报警音频");
}

void RoundTimeBar::onStartBtn()
{
    auto& timerService = TimerService::instance();
    
    if (timerService.isRunning()) {
        // 暂停计时器
        timerService.pauseTimer();
        movie->stop();
        
        // 停止嘀嗒声
        SoundService::instance().stopTickSound();
        
        logInfo("用户暂停计时器");
    } else {
        // 启动计时器 - 使用当前UI显示的值（_value），而不是配置中的固定值
        int durationMs = static_cast<int>(_value * 1000);  // 将秒转换为毫秒
        
        timerService.setAlarms(m_timerConfig);  // 设置报警配置
        timerService.startTimer(
            durationMs,  // 使用当前UI显示的时间
            m_timerConfig.mode
        );
        movie->start();
        
        // 启动嘀嗒声（循环播放）
        SoundService::instance().startTickSound(30);  // 30%音量
        
        logInfo("用户启动计时器 - 时长: " << durationMs << " ms (" << _value << " 秒)");
    }
}

void RoundTimeBar::onResetBtn()
{
    // 重置计时器
    TimerService::instance().resetTimer();
    movie->stop();
    
    // 停止嘀嗒声
    SoundService::instance().stopTickSound();
    
    // 重置UI显示到配置中的初始值
    _value = m_timerConfig.durationMs / 1000.0f;  // 使用配置中的时长（转换为秒）
    update();
    
    logInfo("用户重置计时器到配置值: " << _value << " 秒");
}

void RoundTimeBar::initData()
{
    // ✅ 使用ConfigService获取配置
    m_timerConfig = ConfigService::instance().getTimerConfig();
    m_timeoutAction = ConfigService::instance().getTimeoutAction();
    m_soundSettings = ConfigService::instance().getSoundSettings();
    m_font = ConfigService::instance().getFont();
    
    logDebug("RoundTimeBar配置已加载");
}

void RoundTimeBar::connectTimerService()
{
    auto& timerService = TimerService::instance();
    
    // 连接计时器滴答信号
    connect(&timerService, &TimerService::timerTick,
            this, &RoundTimeBar::onTimerTick);
    
    // 连接报警触发信号
    connect(&timerService, &TimerService::alarmTriggered,
            this, &RoundTimeBar::onAlarmTriggered);
    
    // 连接计时器完成信号
    connect(&timerService, &TimerService::timerFinished,
            this, &RoundTimeBar::onTimerFinished);
    
    logDebug("TimerService 信号已连接");
}

void RoundTimeBar::initForm()
{
    movie = new QMovie(":/resource/gif/shalou2.gif");  // 使用资源文件中的 GIF
    m_pStartBtn = new QPushButton(this);
    m_pStartBtn->setText("");                              // 不显示文本
    m_pStartBtn->setIconSize(QSize(m_nGifWidth, m_nGifWidth));               // 根据需求设置图标大小
    m_pStartBtn->setStyleSheet("border: none;");           // 隐藏边框
    m_pStartBtn->resize(m_nGifWidth,m_nGifWidth);
    m_pStartBtn->setIcon(QIcon(movie->currentPixmap()));      // 将 GIF 动画设置为按钮的图标
    // 连接信号槽，动态更新按钮的图标
    connect(movie, &QMovie::frameChanged, this, [=]() {
        m_pStartBtn->setIcon(QIcon(movie->currentPixmap()));
    });
    connect(m_pStartBtn,&QPushButton::clicked,this,&RoundTimeBar::onStartBtn);
    movie->start();
    movie->stop();


    m_pReflashBtn = new QPushButton(this);
    m_pReflashBtn->setText("");                              // 不显示文本
    m_pReflashBtn->setIcon(QIcon(":/resource/svg/reflash.svg"));     // 设置 SVG 图标
    m_pReflashBtn->setIconSize(QSize(m_nGifWidth/2, m_nGifWidth/2));               // 根据需求设置图标大小
    m_pReflashBtn->setStyleSheet("border: none;");           // 隐藏边框
    m_pReflashBtn->resize(m_nGifWidth/2,m_nGifWidth/2);
    // 连接重置按钮
    connect(m_pReflashBtn, &QPushButton::clicked, 
            this, &RoundTimeBar::onResetBtn);
    
    // ❌ 已移除 _alarmPlayer 初始化
    // ✅ 音频播放由SoundService统一管理
}



void RoundTimeBar::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    //绘制外圈
    paintOutterBar(painter);
    //绘制内圈
    paintInnerBar(painter);
    //绘制外圈
    paintDot(painter);
    // 绘制外圈的点
    //paintDotsAroundCircle(painter);
    //绘制文字
    paintText(painter);
}

//计算绘制正方形区域信息
void RoundTimeBar::caculateSquare()
{
    int minWidth=qMin(this->width(),this->height());
    float barWidth=qMax(_outterBarWidth,_innerBarWidth);
    _squareWidth=minWidth-barWidth- 2;
    _squareStart=barWidth/2+1;
    _dotX=_squareStart+_squareWidth/2;
    _dotY=_squareStart;
}

// ❌ 已移除 startWorkSound() 和 stopWorkSound()
// 音频播放现在由 playAlarmSound() 统一管理

//绘制外圈
void RoundTimeBar::paintOutterBar(QPainter &painter)
{
    if(!(_controlFlags&outterCirle))
        return;
    QPen pen;
    pen.setWidth(_outterBarWidth*0.5);
    pen.setColor(_outterColor);
    painter.setPen(pen);
    QRectF rectangle(_squareStart,_squareStart,_squareWidth,_squareWidth);
    //从90度开始，逆时针旋转
    painter.drawEllipse(rectangle);
}

//绘制内圈
void RoundTimeBar::paintInnerBar(QPainter& painter)
{
    QPen pen;
    if(!(_controlFlags&linearColor))
        pen.setColor(_startColor);
    else
    {
        QLinearGradient gradient(0, 0, 0, _squareWidth);
        gradient.setColorAt(0, _startColor);
        gradient.setColorAt(1, _endColor);
        QBrush brush(gradient);
        pen.setBrush(brush);
    }
    pen.setWidth(_innerBarWidth*0.5);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::RoundCap);
    pen.setJoinStyle(Qt::RoundJoin);
    painter.setPen(pen);
    QRectF rectangle(_squareStart,_squareStart,_squareWidth,_squareWidth);
    //从90度开始，逆时针旋转
    int startAngle=_startAngle*16;
    int spanAngle=(_value-_min)/(_max-_min)*360*16*(_clockWise?-1:1);
    painter.drawArc(rectangle,startAngle,spanAngle);
}

//绘制装饰圆点
void RoundTimeBar::paintDot(QPainter& painter)
{
    if(!(_controlFlags&decorateDot))
        return;
    //当bar宽度小于3时，便不再绘制装饰圆点
    if(_innerBarWidth<3)
        return;
    painter.setPen(QColor(255,255,255));
    painter.setBrush(QColor(255,255,255));
    //区域为圆点绘制正方形区域
    painter.drawEllipse(_dotX-_innerBarWidth/6,_dotY-_innerBarWidth/6,_innerBarWidth/3,_innerBarWidth/3);
}

void RoundTimeBar::paintDotsAroundCircle(QPainter &painter)
{
    if (!(_controlFlags & decorateDot))
        return;

    // 当bar宽度小于3时，便不再绘制装饰圆点
    if (_outterBarWidth < 3)
        return;

    painter.setPen(_startColor);
    painter.setBrush(_endColor);

    // 计算圆心坐标和半径
    int centerX = _squareStart + _squareWidth / 2;
    int centerY = _squareStart + _squareWidth / 2;
    int radius = _squareWidth / 2 + _outterBarWidth / 2;

    QFont font = painter.font();

    font.setPointSize(6);  // 设置显示数字的字体大小
    painter.setFont(font);

    QColor orangeColor(255, 165, 0);  // 定义橙色
    // 绘制每隔5度绘制一个点
    for (int angle = 0; angle < 360; angle += 6) {
        // 将角度转换为弧度
        float radian = qDegreesToRadians(static_cast<float>(angle));

        // 计算点的坐标
        int x = centerX + radius * qCos(radian);
        int y = centerY + radius * qSin(radian);

        painter.setPen(_startColor);
        painter.setBrush(_endColor);

        // 如果当前角度是30的倍数，在圆点附近显示文本
        if (angle % 30 == 0) {
            // 绘制点
            painter.drawEllipse(x - 5, y - 5, 10, 10); // 半径为2的点
            QString text = QString::number(angle / 6);  // 显示"当前度数 / 6"的结果
            // 设置字体颜色为橙色并绘制文本
            painter.setPen(orangeColor);
            painter.drawText(x - 5, y - 5, 10, 10, Qt::AlignCenter, text);  // 将文本居中显示
        }else{
            // 绘制点
            painter.drawEllipse(x - 2, y - 2, 4, 4); // 半径为2的点
        }
    }
}


void RoundTimeBar::paintText(QPainter& painter)
{
    if (!(_controlFlags & defaultText))
        return;


    bool bb = static_cast<int>(_value - _min) > 0 ? true: false;

    painter.setPen(_textColor);


    // 计算总秒数、总分钟数、总小时数
    int totalSeconds = static_cast<int>(abs(_value));
    int hours = totalSeconds / 3600;
    int minutes = (totalSeconds % 3600) / 60;
    int seconds = totalSeconds % 60;

    QString timeText;

    switch (_innerDefaultTextStyle) {
    case SS:
        // 只显示总秒数
        timeText = QString::number(totalSeconds);  // 显示总秒数

        break;

    case MM_SS:
        // 显示总分钟:秒数
        timeText = QString::number(totalSeconds / 60).rightJustified(2, '0') + ":" +
                   QString::number(seconds).rightJustified(2, '0');
        break;

    case HH_MM_SS:
        // 显示小时:分钟:秒数
        timeText = QString::number(hours).rightJustified(2, '0') + ":" +
                   QString::number(minutes).rightJustified(2, '0') + ":" +
                   QString::number(seconds).rightJustified(2, '0');
        break;

    default:
        break;
    }
    painter.setFont(m_font);  // 使用适当的字体和大小
    m_pStartBtn->move(_squareWidth/2 - m_nGifWidth/4, _squareWidth/4 - m_nGifWidth/4);
    m_pReflashBtn->move(_squareWidth/2 + m_nGifWidth/8, _squareWidth*3/4 + m_nGifWidth/8);
    painter.drawText(_squareStart, _squareStart, _squareWidth, _squareWidth, Qt::AlignCenter, timeText);
}

void RoundTimeBar::setInnerDefaultTextStyle(InnerDefaultTextStyle style)
{
    _innerDefaultTextStyle=style;
}
